import { useQueryClient } from '@tanstack/react-query'
import { useParams } from 'common'
import dayjs from 'dayjs'
import { ArrowRight, RefreshCw } from 'lucide-react'
import { parseAsJson, useQueryState } from 'nuqs'
import { useMemo, useState } from 'react'
import ReportHeader from '@/components/interfaces/Reports/ReportHeader'
import ReportPadding from '@/components/interfaces/Reports/ReportPadding'
import {
EDGE_FUNCTION_REGIONS,
REPORT_DATERANGE_HELPER_LABELS,
} from '@/components/interfaces/Reports/Reports.constants'
import ReportStickyNav from '@/components/interfaces/Reports/ReportStickyNav'
import { ReportChartV2 } from '@/components/interfaces/Reports/v2/ReportChartV2'
import {
numericFilterSchema,
ReportsNumericFilter,
} from '@/components/interfaces/Reports/v2/ReportsNumericFilter'
import {
ReportsSelectFilter,
selectFilterSchema,
} from '@/components/interfaces/Reports/v2/ReportsSelectFilter'
import { LogsDatePicker } from '@/components/interfaces/Settings/Logs/Logs.DatePickers'
import UpgradePrompt from '@/components/interfaces/Settings/Logs/UpgradePrompt'
import DefaultLayout from '@/components/layouts/DefaultLayout'
import ObservabilityLayout from '@/components/layouts/ObservabilityLayout/ObservabilityLayout'
import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
import { ReportSettings } from '@/components/ui/Charts/ReportSettings'
import { useChartHoverState } from '@/components/ui/Charts/useChartHoverState'
import { ObservabilityLink } from '@/components/ui/ObservabilityLink'
import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query'
import { edgeFunctionReports } from '@/data/reports/v2/edge-functions.config'
import { useRefreshHandler, useReportDateRange } from '@/hooks/misc/useReportDateRange'
import { BASE_PATH } from '@/lib/constants'
import type { NextPageWithLayout } from '@/types'
const EdgeFunctionsReportV2: NextPageWithLayout = () => {
return (
)
}
EdgeFunctionsReportV2.getLayout = (page) => (
{page}
)
export default EdgeFunctionsReportV2
const EdgeFunctionsUsage = () => {
const { ref } = useParams()
const { data: functions } = useEdgeFunctionsQuery({
projectRef: ref,
})
const chartSyncId = `edge-functions-${ref}`
useChartHoverState(chartSyncId)
// Filters
const [statusCodeFilter, setStatusCodeFilter] = useQueryState(
'status_code',
parseAsJson(numericFilterSchema.parse)
)
const [regionFilter, setRegionFilter] = useQueryState(
'region',
parseAsJson(selectFilterSchema.parse)
)
const [executionTimeFilter, setExecutionTimeFilter] = useQueryState(
'execution_time',
parseAsJson(numericFilterSchema.parse)
)
const [functionFilter, setFunctionFilter] = useQueryState(
'functions',
parseAsJson(selectFilterSchema.parse)
)
const {
selectedDateRange,
updateDateRange,
datePickerValue,
datePickerHelpers,
showUpgradePrompt,
setShowUpgradePrompt,
handleDatePickerChange,
} = useReportDateRange(REPORT_DATERANGE_HELPER_LABELS.LAST_60_MINUTES)
const queryClient = useQueryClient()
const [isRefreshing, setIsRefreshing] = useState(false)
const reportConfig = useMemo(() => {
return edgeFunctionReports({
projectRef: ref!,
functions: functions ?? [],
startDate: selectedDateRange?.period_start?.date ?? '',
endDate: selectedDateRange?.period_end?.date ?? '',
interval: selectedDateRange?.interval ?? 'minute',
filters: {
functions: functionFilter ?? [],
status_code: statusCodeFilter,
region: regionFilter ?? [],
execution_time: executionTimeFilter,
},
})
}, [
ref,
functions,
selectedDateRange,
functionFilter,
statusCodeFilter,
regionFilter,
executionTimeFilter,
])
const onRefreshReport = useRefreshHandler(
datePickerValue,
datePickerHelpers,
handleDatePickerChange,
async () => {
if (!selectedDateRange) return
setIsRefreshing(true)
queryClient.invalidateQueries({ queryKey: ['projects', ref, 'report-v2'] })
setTimeout(() => setIsRefreshing(false), 1000)
}
)
return (
<>
}
className="w-7"
tooltip={{ content: { side: 'bottom', text: 'Refresh report' } }}
onClick={onRefreshReport}
/>
{selectedDateRange && (
{dayjs(selectedDateRange.period_start.date).format('MMM D, h:mma')}
{dayjs(selectedDateRange.period_end.date).format('MMM D, h:mma')}
)}
({
label: fn.name,
value: fn.id,
})) ?? []
}
value={functionFilter ?? []}
onChange={setFunctionFilter}
isLoading={isRefreshing}
showSearch
/>
({
value: region.key,
label: (
{region.label}
{region.key}
),
}))}
value={regionFilter ?? []}
onChange={setRegionFilter}
showSearch
/>
}
>
{selectedDateRange &&
reportConfig
.filter((report) => !report.hide)
.map((report) => (
))}
>
)
}